// 引入依赖
const mysql = require('mysql2/promise');
const Mock = require('mockjs');

// 创建连接池（使用 promise）
const pool = mysql.createPool({
  host: '192.168.182.128',
  port: 3306,
  user: 'root',
  password: 'mysql_KTcCmf',
  database: 'testDB',
  waitForConnections: true,
  connectionLimit: 60, // 最大连接数
  queueLimit: 0,
  multipleStatements: false, // 安全起见关闭多语句执行
});

// 延时函数（用于控制并发）
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 插入数据函数（带事务）
async function insertData(index) {
  const connection = await pool.getConnection();

  try {
    await connection.beginTransaction(); // 开启事务

    const fields = ['userName', 'nickName', 'email', 'sex', 'loginIp', 'loginDate', 'password', 'avatar'];
    let content = '';

    for (let i = 0; i < 100; i++) {
      const user = Mock.mock({
        userName: '@name(true)',
        nickName: '@cname()',
        email: '@email()',
        sex: () => (Math.random() <= 0.999 ? (Math.random() > 0.5 ? '男' : '女') : '未知'),
        loginIp: '@ip()',
        loginDate: '@datetime()',
        password: '@word(5, 10)',
        avatar: '@url()',
      });

      let values = '(';
      fields.forEach(key => {
        // 使用 escape 防止 SQL 注入
        const escapedValue = connection.escape(user[key]);
        values += `${escapedValue},`;
      });
      values = values.slice(0, -1) + ')';

      content += values + ',';
    }

    content = content.slice(0, -1); // 删除最后的逗号

    const sql = `
      INSERT INTO hash_user 
      (user_name, nick_name, email, sex, login_ip, login_date, password, avatar) 
      VALUES ${content}
    `;

    await connection.query(sql);
    await connection.commit(); // 提交事务
    console.log(`第 ${index} 批数据插入成功`);
  } catch (error) {
    await connection.rollback(); // 出错回滚
    console.error(`第 ${index} 批数据插入失败：`, error.message);
  } finally {
    connection.release(); // 释放连接回连接池
  }
}

// 主函数：控制并发插入
async function main() {
  const totalBatches = 40; // 总共插入批次
  const batchSize = 10; // 每次并发执行多少个插入任务
  const delayBetweenBatches = 200; // 每批之间延迟（毫秒）

  // 记录开始时间
  const startTime = Date.now();

  for (let i = 0; i < totalBatches; i += batchSize) {
    const batchPromises = [];

    for (let j = 0; j < batchSize && i + j < totalBatches; j++) {
      batchPromises.push(insertData(i + j));
    }

    await Promise.all(batchPromises);
    console.log(`已完成第 ${i + batchSize} 批插入`);

    if (i + batchSize < totalBatches) {
      console.log(`等待 ${delayBetweenBatches} 毫秒后继续...`);
      await delay(delayBetweenBatches);
    }
  }

  // 记录结束时间
  const endTime = Date.now();
  const duration = endTime - startTime; // 单位：毫秒

  // 格式化为分钟和秒
  const minutes = Math.floor(duration / 60000);
  const seconds = ((duration % 60000) / 1000).toFixed(0);

  console.log('全部数据插入完成！');
  console.log(`总共耗时：${minutes} 分 ${seconds} 秒`);
}

// 启动主函数
main();